Add 'baud' option to magproto.
program. Communication errors are handled and verification of
data is turned on.
+ Additional options:
+ baud: may be 1200, 2400, 4800, 9600, 19200, but must match receiver.
+
GARMIN
Waypoint serial upload and download works reliably under both
struct pdb_record *opdb_rec;
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "rb");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "wb");
out_fname = fname;
#define MYNAME "CSV"
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "r");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "w");
if (file_out == NULL) {
}
static void
-xmap_wr_init(const char *fname)
+xmap_wr_init(const char *fname, const char *args)
{
- wr_init(fname);
+ wr_init(fname, args);
fprintf(file_out, "BEGIN SYMBOL\n");
}
extern global_options global_opts;
-
/*
* Extended data if waypoint happens to represent a geocache. This is
* totally voluntary data...
int rte_num;
} route_head;
-typedef void (*ff_init) (char const *);
+typedef void (*ff_init) (char const *, char const *);
typedef void (*ff_deinit) (void);
typedef void (*ff_read) (void);
typedef void (*ff_write) (void);
+char * get_option(const char *iarglist, const char *argname);
void fprintdms(FILE *, const coord *, int);
__attribute__ ((__format__ (__printf__, 1, 2)));
#endif
;
-ff_vecs_t *find_vec(char *);
+ff_vecs_t *find_vec(char *, char **);
void disp_vecs(void);
void printposn(const coord *c, int is_lat);
#define MYNAME "DNA"
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "r");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "w");
if (file_out == NULL) {
static const char *portname;
static void
-rw_init(const char *fname)
+rw_init(const char *fname, const char *opts)
{
if (GPS_Init(fname) < 0) {
fatal(MYNAME ":Can't init %s\n", fname);
}
void
-geo_rd_init(const char *fname)
+geo_rd_init(const char *fname, const char *args)
{
fd = fopen(fname, "r");
if (fd == NULL) {
}
void
-geo_wr_init(const char *fname)
+geo_wr_init(const char *fname, const char *args)
{
ofd = fopen(fname, "w");
if (ofd == NULL) {
#define MYNAME "GPSMAN"
static void
-gpsman_rd_init(const char *fname)
+gpsman_rd_init(const char *fname, const char *args)
{
in_file = fopen(fname, "r");
if (in_file == NULL) {
}
static void
-gpsman_wr_init(const char *fname)
+gpsman_wr_init(const char *fname, const char *args)
{
out_file = fopen(fname, "w");
if (out_file == NULL) {
struct pdb_record *opdb_rec;
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "rb");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "wb");
out_fname = fname;
#define MYNAME "GPSUTIL"
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "r");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "w");
if (file_out == NULL) {
}
void
-gpx_rd_init(const char *fname)
+gpx_rd_init(const char *fname, const char *args)
{
fd = fopen(fname, "r");
if (fd == NULL) {
}
void
-gpx_wr_init(const char *fname)
+gpx_wr_init(const char *fname, const char *args)
{
ofd = fopen(fname, "w");
if (ofd == NULL) {
static char fOutname[256];
-static void rd_init(const char *fname)
+static void rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "rb");
if (file_in == NULL) {
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
HxWFile = xcalloc(GM100_WPO_FILE_SIZE, 1);
struct pdb_record *opdb_rec;
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "rb");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "wb");
out_fname = fname;
#include "defs.h"
#include "magellan.h"
-#define BAUDRATE B4800
+int bitrate = 4800;
#define MYNAME "MAGPROTO"
#if __WIN32__
#include <windows.h>
+DWORD
+mkspeed(bitrate)
+{
+ switch (bitrate) {
+ case 1200: return CBR_1200;
+ case 2400: return CBR_2400;
+ case 4800: return CBR_4800;
+ case 9600: return CBR_9600;
+ case 19200: return CBR_19200;
+ default: return CBR_4800;
+ }
+}
+
HANDLE comport;
static
}
tio.DCBlength = sizeof(DCB);
GetCommState (comport, &tio);
- tio.BaudRate = CBR_4800;
+ tio.BaudRate = mkspeed(bitrate);
tio.fBinary = TRUE;
tio.fParity = TRUE;
tio.fOutxCtsFlow = FALSE;
#include <termios.h>
+speed_t
+mkspeed(unsigned br)
+{
+ switch (br) {
+ case 1200: return B1200;
+ case 2400: return B2400;
+ case 4800: return B4800;
+ case 9600: return B9600;
+ case 19200: return B19200;
+ default: return B4800;
+ }
+}
+
+
static struct termios orig_tio;
static void
terminit(const char *portname)
new_tio.c_cc[VTIME] = 10;
new_tio.c_cc[VMIN] = 0;
- cfsetospeed(&new_tio, BAUDRATE);
- cfsetispeed(&new_tio, BAUDRATE);
+ cfsetospeed(&new_tio, mkspeed(bitrate));
+ cfsetispeed(&new_tio, mkspeed(bitrate));
tcsetattr(magfd, TCSAFLUSH, &new_tio);
}
static void
-mag_rd_init(const char *portname)
+mag_rd_init(const char *portname, const char *args)
{
time_t now, later;
+ char * bs = get_option(args, "baud");
+
+ if (bs) {
+ bitrate=atoi(bs);
+ }
terminit(portname);
}
static void
-mag_wr_init(const char *portname)
+mag_wr_init(const char *portname, const char *args)
{
struct stat sbuf;
* reading and writing, so we let rd_init do the dirty work.
*/
fclose(magfile_out);
- mag_rd_init(portname);
+ mag_rd_init(portname, args);
}
}
ff_vecs_t *ovecs = NULL;
char *fname = NULL;
char *ofname = NULL;
+ char *ivec_opts = NULL;
+ char *ovec_opts = NULL;
waypt_init();
route_init();
switch (c) {
case 'i':
- ivecs = find_vec(optarg);
+ ivecs = find_vec(optarg, &ivec_opts);
argn++;
break;
case 'o':
- ovecs = find_vec(optarg);
+ ovecs = find_vec(optarg, &ovec_opts);
argn++;
break;
case 'f':
if (ivecs == NULL) {
fatal ("No valid input type specified");
}
- ivecs->rd_init(fname);
+ ivecs->rd_init(fname, ivec_opts);
ivecs->read();
ivecs->rd_deinit();
break;
ofname = optarg;
argn++;
if (ovecs) {
- ovecs->wr_init(ofname);
+ ovecs->wr_init(ofname, ovec_opts);
ovecs->write();
ovecs->wr_deinit();
}
}
static void
-mapsend_rd_init(const char *fname)
+mapsend_rd_init(const char *fname, const char *args)
{
mapsend_file_in = fopen(fname, "rb");
if (mapsend_file_in == NULL) {
}
static void
-mapsend_wr_init(const char *fname)
+mapsend_wr_init(const char *fname, const char *args)
{
mapsend_file_out = fopen(fname, "wb");
if (mapsend_file_out == NULL) {
#define MYNAME "MAPSOURCE"
static void
-mapsource_rd_init(const char *fname)
+mapsource_rd_init(const char *fname, const char *args)
{
mapsource_file_in = fopen(fname, "r");
if (mapsource_file_in == NULL) {
}
static void
-mapsource_wr_init(const char *fname)
+mapsource_wr_init(const char *fname, const char *args)
{
mapsource_file_out = fopen(fname, "w");
if (mapsource_file_out == NULL) {
static FILE *file_out;
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "r");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "w");
if (file_out == NULL) {
static FILE *file_out;
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "r");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "w");
if (file_out == NULL) {
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "r");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "w");
if (file_out == NULL) {
}
static void
-psp_rd_init(const char *fname)
+psp_rd_init(const char *fname, const char *args)
{
psp_file_in = fopen(fname, "rb");
if (psp_file_in == NULL) {
}
static void
-psp_wr_init(const char *fname)
+psp_wr_init(const char *fname, const char *args)
{
psp_file_out = fopen(fname, "wb");
if (psp_file_out == NULL) {
#define MYNAME "GPSUTIL"
static void
-rd_init(const char *fname)
+rd_init(const char *fname, const char *args)
{
file_in = fopen(fname, "r");
if (file_in == NULL) {
}
static void
-wr_init(const char *fname)
+wr_init(const char *fname, const char *args)
{
file_out = fopen(fname, "w");
if (file_out == NULL) {
}
static void
-tpg_rd_init(const char *fname)
+tpg_rd_init(const char *fname, const char *args)
{
tpg_file_in = fopen(fname, "rb");
if (tpg_file_in == NULL) {
}
static void
-tpg_wr_init(const char *fname)
+tpg_wr_init(const char *fname, const char *args)
{
tpg_file_out = fopen(fname, "wb");
if (tpg_file_out == NULL) {
};
ff_vecs_t *
-find_vec(char *const vecname)
+find_vec(char *const vecname, char **opts)
{
vecs_t *vec = vec_list;
+ char *v = xstrdup(vecname);
+ char *svecname = strtok(v, ",");
+
while (vec->vec) {
- if (strcmp(vecname, vec->name) == 0) {
+ if (strcmp(svecname, vec->name) == 0) {
+ char * res = strchr(vecname, ',');
+ if (res)
+ *opts = strchr(vecname, ',')+1;
+ else
+ *opts = NULL;
+ free(v);
return vec->vec;
}
vec++;
}
+ free(v);
return NULL;
}
+/*
+ * Find and return a specific argument in an arg list.
+ * Modelled approximately after getenv.
+ */
+char *
+get_option(const char *iarglist, const char *argname)
+{
+ size_t arglen = strlen(argname);
+ char *arglist;
+ char *rval = NULL;
+ char *arg;
+ char *argp;
+
+ if (!iarglist) {
+ return NULL;
+ }
+
+ arglen = strlen(argname);
+ arglist = xstrdup(iarglist);
+
+ for (arg = arglist; argp = strtok(arg, ","); arg = NULL) {
+ if (0 == strncmp(argp, argname, arglen)) {
+ /*
+ * If we have something of the form "foo=bar"
+ * return "bar". Otherwise, we assume we have
+ * simply "foo" so we return that.
+ */
+ if (argp[arglen] == '=')
+ rval = argp + arglen + 1;
+ else
+ rval = argp;
+ break;
+ }
+ }
+ free(arglist);
+ return rval;
+}
+
void
disp_vecs(void)
{